From d22c0aa8355ab5938f99db111cde41e2731b3bca Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Tue, 6 Sep 2005 18:01:24 +0000 Subject: [PATCH] phys_to_mach and mach_to_phys tables contain long entries, not 32-bit entries. Signed-off-by: Keir Fraser --- .../arch/xen/i386/kernel/setup.c | 21 +++++++++---------- linux-2.6-xen-sparse/arch/xen/kernel/reboot.c | 2 +- .../arch/xen/x86_64/kernel/head64.c | 2 +- .../arch/xen/x86_64/kernel/setup.c | 16 +++++++------- .../include/asm-xen/asm-i386/page.h | 12 +++++------ .../include/asm-xen/asm-x86_64/page.h | 14 ++++++------- .../include/asm-xen/asm-x86_64/pgtable.h | 2 +- tools/libxc/xc_linux_build.c | 2 +- xen/arch/x86/domain_build.c | 6 +++--- xen/arch/x86/mm.c | 2 +- xen/arch/x86/x86_32/mm.c | 2 +- xen/arch/x86/x86_64/mm.c | 2 +- xen/include/asm-x86/mm.h | 6 +++--- xen/include/public/arch-x86_32.h | 2 +- xen/include/public/arch-x86_64.h | 2 +- 15 files changed, 46 insertions(+), 47 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c index 611cd67695..2479d87972 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c @@ -359,7 +359,7 @@ static void __init probe_roms(void) shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page; EXPORT_SYMBOL(HYPERVISOR_shared_info); -unsigned int *phys_to_machine_mapping, *pfn_to_mfn_frame_list; +unsigned long *phys_to_machine_mapping, *pfn_to_mfn_frame_list; EXPORT_SYMBOL(phys_to_machine_mapping); /* Raw start-of-day parameters from the hypervisor. */ @@ -1206,7 +1206,7 @@ void __init setup_bootmem_allocator(void) } #endif - phys_to_machine_mapping = (unsigned int *)xen_start_info->mfn_list; + phys_to_machine_mapping = (unsigned long *)xen_start_info->mfn_list; } /* @@ -1638,15 +1638,15 @@ void __init setup_arch(char **cmdline_p) /* Make sure we have a correctly sized P->M table. */ if (max_pfn != xen_start_info->nr_pages) { phys_to_machine_mapping = alloc_bootmem_low_pages( - max_pfn * sizeof(unsigned int)); + max_pfn * sizeof(unsigned long)); if (max_pfn > xen_start_info->nr_pages) { /* set to INVALID_P2M_ENTRY */ memset(phys_to_machine_mapping, ~0, - max_pfn * sizeof(unsigned int)); + max_pfn * sizeof(unsigned long)); memcpy(phys_to_machine_mapping, - (unsigned int *)xen_start_info->mfn_list, - xen_start_info->nr_pages * sizeof(unsigned int)); + (unsigned long *)xen_start_info->mfn_list, + xen_start_info->nr_pages * sizeof(unsigned long)); } else { struct xen_memory_reservation reservation = { .extent_start = (unsigned long *)xen_start_info->mfn_list + max_pfn, @@ -1656,9 +1656,8 @@ void __init setup_arch(char **cmdline_p) }; memcpy(phys_to_machine_mapping, - (unsigned int *)xen_start_info->mfn_list, - max_pfn * sizeof(unsigned int)); - /* N.B. below relies on sizeof(int) == sizeof(long). */ + (unsigned long *)xen_start_info->mfn_list, + max_pfn * sizeof(unsigned long)); BUG_ON(HYPERVISOR_memory_op( XENMEM_decrease_reservation, &reservation) != @@ -1667,11 +1666,11 @@ void __init setup_arch(char **cmdline_p) free_bootmem( __pa(xen_start_info->mfn_list), PFN_PHYS(PFN_UP(xen_start_info->nr_pages * - sizeof(unsigned int)))); + sizeof(unsigned long)))); } pfn_to_mfn_frame_list = alloc_bootmem_low_pages(PAGE_SIZE); - for ( i=0, j=0; i < max_pfn; i+=(PAGE_SIZE/sizeof(unsigned int)), j++ ) + for ( i=0, j=0; i < max_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) { pfn_to_mfn_frame_list[j] = virt_to_mfn(&phys_to_machine_mapping[i]); diff --git a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c index 1c942548e1..50e645a69f 100644 --- a/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c +++ b/linux-2.6-xen-sparse/arch/xen/kernel/reboot.c @@ -81,7 +81,7 @@ static int __do_suspend(void *ignore) extern void time_suspend(void); extern void time_resume(void); extern unsigned long max_pfn; - extern unsigned int *pfn_to_mfn_frame_list; + extern unsigned long *pfn_to_mfn_frame_list; #ifdef CONFIG_SMP extern void smp_suspend(void); diff --git a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head64.c b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head64.c index 68e79771c0..734b9d3082 100644 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head64.c +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/head64.c @@ -90,7 +90,7 @@ void __init x86_64_start_kernel(char * real_mode_data) { int i; - phys_to_machine_mapping = (u32 *)xen_start_info->mfn_list; + phys_to_machine_mapping = (unsigned long *)xen_start_info->mfn_list; start_pfn = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) + xen_start_info->nr_pt_frames; diff --git a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c index ca1225eb6f..05dab06d4a 100644 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c @@ -76,7 +76,7 @@ EXPORT_SYMBOL(HYPERVISOR_shared_info); /* Allows setting of maximum possible memory size */ unsigned long xen_override_max_pfn; -u32 *phys_to_machine_mapping, *pfn_to_mfn_frame_list; +unsigned long *phys_to_machine_mapping, *pfn_to_mfn_frame_list; EXPORT_SYMBOL(phys_to_machine_mapping); @@ -734,22 +734,22 @@ void __init setup_arch(char **cmdline_p) /* Make sure we have a large enough P->M table. */ if (end_pfn > xen_start_info->nr_pages) { phys_to_machine_mapping = alloc_bootmem( - end_pfn * sizeof(u32)); + end_pfn * sizeof(unsigned long)); memset(phys_to_machine_mapping, ~0, - end_pfn * sizeof(u32)); + end_pfn * sizeof(unsigned long)); memcpy(phys_to_machine_mapping, - (u32 *)xen_start_info->mfn_list, - xen_start_info->nr_pages * sizeof(u32)); + (unsigned long *)xen_start_info->mfn_list, + xen_start_info->nr_pages * sizeof(unsigned long)); free_bootmem( __pa(xen_start_info->mfn_list), PFN_PHYS(PFN_UP(xen_start_info->nr_pages * - sizeof(u32)))); + sizeof(unsigned long)))); } pfn_to_mfn_frame_list = alloc_bootmem(PAGE_SIZE); - for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(u32)), j++ ) - pfn_to_mfn_frame_list[j] = + for ( i=0, j=0; i < end_pfn; i+=(PAGE_SIZE/sizeof(unsigned long)), j++ ) + pfn_to_mfn_frame_list[j] = virt_to_mfn(&phys_to_machine_mapping[i]); } #endif diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h index 1bcc85e465..788aa0637b 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h @@ -60,14 +60,14 @@ #define copy_user_page(to, from, vaddr, pg) copy_page(to, from) /**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ -#define INVALID_P2M_ENTRY (~0U) -#define FOREIGN_FRAME(m) ((m) | 0x80000000U) -extern unsigned int *phys_to_machine_mapping; +#define INVALID_P2M_ENTRY (~0UL) +#define FOREIGN_FRAME(m) ((m) | (1UL<<31)) +extern unsigned long *phys_to_machine_mapping; #define pfn_to_mfn(pfn) \ -((unsigned long)phys_to_machine_mapping[(unsigned int)(pfn)] & 0x7FFFFFFFUL) +(phys_to_machine_mapping[(unsigned int)(pfn)] & ~(1UL<<31)) static inline unsigned long mfn_to_pfn(unsigned long mfn) { - unsigned int pfn; + unsigned long pfn; /* * The array access can fail (e.g., device space beyond end of RAM). @@ -83,7 +83,7 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn) ".previous" : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) ); - return (unsigned long)pfn; + return pfn; } /* Definitions for machine and pseudophysical addresses. */ diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h index 96d5107548..fd7a675488 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h @@ -62,14 +62,14 @@ void copy_page(void *, void *); #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE /**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ -#define INVALID_P2M_ENTRY (~0U) -#define FOREIGN_FRAME(m) ((m) | 0x80000000U) -extern u32 *phys_to_machine_mapping; +#define INVALID_P2M_ENTRY (~0UL) +#define FOREIGN_FRAME(m) ((m) | (1UL<<63)) +extern unsigned long *phys_to_machine_mapping; #define pfn_to_mfn(pfn) \ -((unsigned long)phys_to_machine_mapping[(unsigned int)(pfn)] & 0x7FFFFFFFUL) +(phys_to_machine_mapping[(unsigned int)(pfn)] & ~(1UL << 63)) static inline unsigned long mfn_to_pfn(unsigned long mfn) { - unsigned int pfn; + unsigned long pfn; /* * The array access can fail (e.g., device space beyond end of RAM). @@ -77,7 +77,7 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn) * but we must handle the fault without crashing! */ asm ( - "1: movl %1,%k0\n" + "1: movq %1,%0\n" "2:\n" ".section __ex_table,\"a\"\n" " .align 8\n" @@ -85,7 +85,7 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn) ".previous" : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) ); - return (unsigned long)pfn; + return pfn; } /* Definitions for machine and pseudophysical addresses. */ diff --git a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h index e07b8810b3..e8f986c452 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/pgtable.h @@ -307,7 +307,7 @@ inline static void set_pte_at(struct mm_struct *mm, unsigned long addr, #define pte_pfn(_pte) \ ({ \ unsigned long mfn = pte_mfn(_pte); \ - unsigned pfn = mfn_to_pfn(mfn); \ + unsigned long pfn = mfn_to_pfn(mfn); \ if ((pfn >= max_mapnr) || (phys_to_machine_mapping[pfn] != mfn))\ pfn = max_mapnr; /* special: force !pfn_valid() */ \ pfn; \ diff --git a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c index aa6e78156e..e8e24edc16 100644 --- a/tools/libxc/xc_linux_build.c +++ b/tools/libxc/xc_linux_build.c @@ -348,7 +348,7 @@ static int setup_guest(int xc_handle, unsigned long nr_pt_pages; unsigned long physmap_pfn; - u32 *physmap, *physmap_e; + unsigned long *physmap, *physmap_e; struct load_funcs load_funcs; struct domain_setup_info dsi; diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index 0b9cbb1b29..98a7ec0902 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -218,7 +218,7 @@ int construct_dom0(struct domain *d, vinitrd_start = round_pgup(dsi.v_end); vinitrd_end = vinitrd_start + initrd_len; vphysmap_start = round_pgup(vinitrd_end); - vphysmap_end = vphysmap_start + (nr_pages * sizeof(u32)); + vphysmap_end = vphysmap_start + (nr_pages * sizeof(unsigned long)); vstartinfo_start = round_pgup(vphysmap_end); vstartinfo_end = vstartinfo_start + PAGE_SIZE; vpt_start = vstartinfo_end; @@ -613,7 +613,7 @@ int construct_dom0(struct domain *d, if ( !opt_dom0_translate && (pfn > REVERSE_START) ) mfn = alloc_epfn - (pfn - REVERSE_START); #endif - ((u32 *)vphysmap_start)[pfn] = mfn; + ((unsigned long *)vphysmap_start)[pfn] = mfn; set_pfn_from_mfn(mfn, pfn); } while ( pfn < nr_pages ) @@ -626,7 +626,7 @@ int construct_dom0(struct domain *d, #ifndef NDEBUG #define pfn (nr_pages - 1 - (pfn - (alloc_epfn - alloc_spfn))) #endif - ((u32 *)vphysmap_start)[pfn] = mfn; + ((unsigned long *)vphysmap_start)[pfn] = mfn; set_pfn_from_mfn(mfn, pfn); #undef pfn page++; pfn++; diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 119906b132..41fd471127 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -1450,7 +1450,7 @@ int get_page_type(struct pfn_info *page, unsigned long type) ((type & PGT_type_mask) != PGT_l1_page_table) ) MEM_LOG("Bad type (saw %" PRtype_info "!= exp %" PRtype_info ") " - "for mfn %lx (pfn %x)", + "for mfn %lx (pfn %lx)", x, type, page_to_pfn(page), get_pfn_from_mfn(page_to_pfn(page))); return 0; diff --git a/xen/arch/x86/x86_32/mm.c b/xen/arch/x86/x86_32/mm.c index bd67cf5421..002b9f8bc6 100644 --- a/xen/arch/x86/x86_32/mm.c +++ b/xen/arch/x86/x86_32/mm.c @@ -95,7 +95,7 @@ void __init paging_init(void) * Allocate and map the machine-to-phys table and create read-only mapping * of MPT for guest-OS use. */ - mpt_size = (max_page * 4) + (1UL << L2_PAGETABLE_SHIFT) - 1UL; + mpt_size = (max_page * BYTES_PER_LONG) + (1UL << L2_PAGETABLE_SHIFT) - 1; mpt_size &= ~((1UL << L2_PAGETABLE_SHIFT) - 1UL); for ( i = 0; i < (mpt_size >> L2_PAGETABLE_SHIFT); i++ ) { diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c index 5233c92b9f..76b3518111 100644 --- a/xen/arch/x86/x86_64/mm.c +++ b/xen/arch/x86/x86_64/mm.c @@ -98,7 +98,7 @@ void __init paging_init(void) * Allocate and map the machine-to-phys table. * This also ensures L3 is present for fixmaps. */ - mpt_size = (max_page * 4) + (1UL << L2_PAGETABLE_SHIFT) - 1UL; + mpt_size = (max_page * BYTES_PER_LONG) + (1UL << L2_PAGETABLE_SHIFT) - 1; mpt_size &= ~((1UL << L2_PAGETABLE_SHIFT) - 1UL); for ( i = 0; i < (mpt_size >> L2_PAGETABLE_SHIFT); i++ ) { diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h index d2e66253cc..4b7eb641ff 100644 --- a/xen/include/asm-x86/mm.h +++ b/xen/include/asm-x86/mm.h @@ -255,9 +255,9 @@ int check_descriptor(struct desc_struct *d); * contiguous (or near contiguous) physical memory. */ #undef machine_to_phys_mapping -#define machine_to_phys_mapping ((u32 *)RDWR_MPT_VIRT_START) -#define INVALID_M2P_ENTRY (~0U) -#define VALID_M2P(_e) (!((_e) & (1U<<31))) +#define machine_to_phys_mapping ((unsigned long *)RDWR_MPT_VIRT_START) +#define INVALID_M2P_ENTRY (~0UL) +#define VALID_M2P(_e) (!((_e) & (1UL<<(BITS_PER_LONG-1)))) #define IS_INVALID_M2P_ENTRY(_e) (!VALID_M2P(_e)) #define set_pfn_from_mfn(mfn, pfn) (machine_to_phys_mapping[(mfn)] = (pfn)) diff --git a/xen/include/public/arch-x86_32.h b/xen/include/public/arch-x86_32.h index 2c7b0db362..cf0a43c50c 100644 --- a/xen/include/public/arch-x86_32.h +++ b/xen/include/public/arch-x86_32.h @@ -55,7 +55,7 @@ # define HYPERVISOR_VIRT_START (0xFC000000UL) #endif #ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((u32 *)HYPERVISOR_VIRT_START) +#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) #endif /* Maximum number of virtual CPUs in multi-processor guests. */ diff --git a/xen/include/public/arch-x86_64.h b/xen/include/public/arch-x86_64.h index 4594b946a7..81b1ecd6fd 100644 --- a/xen/include/public/arch-x86_64.h +++ b/xen/include/public/arch-x86_64.h @@ -71,7 +71,7 @@ /* The machine->physical mapping table starts at this address, read-only. */ #ifndef machine_to_phys_mapping -#define machine_to_phys_mapping ((u32 *)HYPERVISOR_VIRT_START) +#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START) #endif /* -- 2.30.2